#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <pthread.h>

#define NUM 100000

#define TAM 125

void error(const char *msg)
{
	perror(msg);
	exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    double tempo;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    struct timeval tmr0, tmr1, tmr2, tmr3;
    char buffer[256]; //string para receber confirmacao de envio	

	gettimeofday(&tmr0, 0);        
	int vet[TAM], ori[TAM], i, vetor[1000];
	srand(time(NULL));
	
	for(i=0;i<TAM;i++)
	{
		vet[i] = (rand()%NUM)+1;
		ori[i] = vet[i];
	}
	//argv:
	//1 = nome do servidor
	//2 = porta do servidor
	if(argc<3)
	{
		fprintf(stderr,"numero invalido de argumentos");
    	exit(0);
    }
     
    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0)
    	error("ERROR abrindo socket");
    server = gethostbyname(argv[1]);
    if(server == NULL)
    {
    	fprintf(stderr,"ERORR, nao ha nome do host\n");
    	exit(0);
    }
    bzero((char*) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    
	gettimeofday(&tmr2, 0);
	if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR conectando\n");
    n = write(sockfd,vet,sizeof(int)*TAM); //enviando vetor
    if (n < 0) 
        error("ERROR escrevendo no soccket\n");
    bzero(buffer,256);
    n = recv(sockfd,buffer,3,MSG_WAITALL); //recebe msg de confirmacao
    if (n < 0)
    	error("ERROR recebendo string de confirmacao do socket\n");
	gettimeofday(&tmr3, 0);
	tempo = 1000000*(tmr3.tv_sec - tmr2.tv_sec)+(tmr3.tv_usec - tmr2.tv_usec);
	printf("\nTempo_conexao_12: %.2f us\n", tempo);	

    printf("%s\n",buffer);
	
	gettimeofday(&tmr2, 0);
    n = recv(sockfd,vetor,sizeof(int)*1000,MSG_WAITALL); //recebe vetor final
    if (n < 0)
		error("ERROR recebendo vetor final do socket\n");
	gettimeofday(&tmr3, 0);
	tempo = 1000000*(tmr3.tv_sec - tmr2.tv_sec)+(tmr3.tv_usec - tmr2.tv_usec);
	printf("\nTempo_conexao_21: %.2f us\n", tempo);

	for(i=0;i<1000;i++)
		printf(" %d ",vetor[i]);
	
    gettimeofday(&tmr1, 0);
    tempo = 1000000*(tmr1.tv_sec - tmr0.tv_sec) + (tmr1.tv_usec - tmr0.tv_usec);
    printf("\nTempo_total: %.2f us\n", tempo);	
    close(sockfd);

	return 0;
}